package inge_soft.gestoriusNuevo.business.service.abstraction;

import inge_soft.gestoriusNuevo.persistence.DAO.Exceptions.Abstraction.GestoriusException;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Documento;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Domicilio;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Localidad;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Pais;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.TipoDocumento;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Usuario;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.UsuarioRegistrado;

import java.util.Collection;
import java.util.List;

import org.springframework.dao.DataAccessException;

public interface IUsuarioService {

	/*
	 * Servicios de las tipos de documentos
	 */
	
	public List<TipoDocumento> obtenerTodosTiposDocumentoOrdenadosPorNombreAscendente() throws DataAccessException;
	
	
	/*
	 * Servicios de los usuarios
	 */
	
	public void crearUsuario(Usuario usuario, UsuarioRegistrado usuarioRegistrado, Documento documento, Domicilio domicilio)
			throws DataAccessException;

	public void modificarUsuario(Usuario usuario) throws DataAccessException;

	public void eliminarUsuario(Usuario usuario) throws GestoriusException;
	
	public Usuario obtenerUsuario(long id);

	public List<Usuario> buscarTodosUsuarios() throws GestoriusException;
	
	/*
	 * Servicios de los usuarios registrados
	 */
	
	public void crearUsuarioRegistrado(UsuarioRegistrado usuarioR) throws DataAccessException;
	
	public void modificarUsuarioRegistrado(UsuarioRegistrado usuarioR) throws GestoriusException;
	
	public void eliminarUsuarioRegistrado(UsuarioRegistrado usuarioR) throws GestoriusException;
	
	public UsuarioRegistrado obtenerUsuarioRegistrado(String nick);
	
	public UsuarioRegistrado obtenerUsuarioRegistrado(Long idUsuario);
	
	public UsuarioRegistrado verificarLogin(UsuarioRegistrado usr) throws GestoriusException;

	public List<UsuarioRegistrado> buscarTodosUsuarioRegistrado(UsuarioRegistrado usuarioR) throws GestoriusException;

	/*
	 * Servicios de las localidades
	 */
	
	public List<Localidad> obtenerTodasLasLocalidadesDePaisOrdenadasPorNombreAscendente(Pais pais) throws DataAccessException;
	
	public List<Localidad> obtenerTodasLasLocalidadesDePaisQueCoincidaConCodigoPostalOrdenadasPorNombreAscendente(
			Pais pais, String codigoPostal) throws GestoriusException;
	
	public List<Localidad> obtenerLasLocalidadesDePaisQueCoincidanConNombreOrdenadasPorNombreAscendente(
			Pais pais, String nombre) throws GestoriusException;
	
	/*
	 * Servicios de los paises
	 */

	public List<Pais> obtenerTodosLosPaisesOrdenadosPorNombreAscendente() throws GestoriusException;
	
	public List<Pais> obtenerTodosLosPaisesOrdenadosPorNombreNacionalidadAscendente() throws DataAccessException;

	
	/*
	 * Servicios de las localidades
	 */
	
	public void enviarMailReestablecerContrasenia(UsuarioRegistrado usr);
	
	public String generadorStringRandom();
}
